package model;

import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import Utils.SystemeDeTaxes;
import Utils.SystemeTaxesBidon;

public class Facture implements Iterable<Sejour>, Comparator<Facture>{
	private static int numFacture = 1;
	private static SystemeDeTaxes taxes = new SystemeTaxesBidon();
	private int actualNumFacture;
	private Set<Sejour> sejours;
	private long sousTotal, paiement;
	
	public Facture(Sejour sejour){
		actualNumFacture = numFacture++;
		sejours = new HashSet<Sejour>();
		sejours.add(sejour);
		sousTotal = sejour.getCoutSejour();
	}
	
	public void setPaiement(long pay){
		paiement = pay;
		for (Sejour itSej:sejours){
			for (LigneSejour itLigne:itSej){
				itLigne.setIsFacture(true);
			}
		}
	}
	
	/**
	 * Ajout le sejour au set de sejour et ajoute le cout du sejour au sous total
	 * @param sejour
	 */
	public void add(Sejour sejour){
		if (sejours.add(sejour)){
			sousTotal += sejour.getCoutSejour();
		}
	}
	
	/**
	 *
	 * @return le sous total de la facture.
	 */
	public long getSousTotal(){
		return sousTotal;
	}
	
	/**
	 * Calcule les taxes.
	 * @return le montant de taxes de la facture.
	 */
	public long genererTotalTaxesFacture(){
		return taxes.calculerTaxes(sousTotal);
	}
	
	/**
	 * retourne le numero de cette facture
	 * @return
	 */
	public int getNumFacture(){
		return actualNumFacture;
	}
	
	public long getPaiement(){
		return paiement;
	}

	@Override
	public Iterator<Sejour> iterator() {
		return sejours.iterator();
	}

	@Override
	public int compare(Facture facture1, Facture facture2) {
		return facture1.getNumFacture() - facture2.getNumFacture();
	}
	
	public boolean equals(Facture facture1){
		return (compare(this,facture1) == 0);
	}
}
